package com.xbai.spark.core.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * reduceByKey(func, [numTasks]) 算子
  * 作用：在一个 (K,V) 的 RDD 上调用，返回一个 (K,V) 的 RDD，使用指定的 reduce 函数，将相同 key 的值聚合到一起，reduce 任务的个数可以通过第二个可选的参数来设置。
  * 按照 key 进行聚合，在 shuffle 之前有 combine（预聚合）操作，返回结果是RDD[k,v].
  * 案例：创建一个pairRDD，计算相同key对应值的相加结果
  *
  * @author xbai
  * @Date 2020/12/30
  */
object Spark17_ReduceByKey {

  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("reduceByKey")
    val sc = new SparkContext(conf)

    val words = Array("one", "two", "two", "three", "three", "three")
    // 创建一个pairRDD
    val wordToOneRDD: RDD[(String, Int)] = sc.parallelize(words).map((_, 1))
    // 计算相同key对应值的相加结果
    val wordToCountRDD: RDD[(String, Int)] = wordToOneRDD.reduceByKey(_ + _)
    wordToCountRDD.collect().foreach(println)
  }
}
